package ModelAndController;
/*
 * A huzalok kivételével, az összes hálózati elem alapvető tulajdonságait 
 * meghatározó absztrakt ősosztály. Az építőelem aktuális 
 * belső állapotának tárolására, a közvetlenül kapcsolódó huzalok nyilvántartására, 
 * az építőelem helyes ütemezésére nyújt lehetőséget. 
 */
//Exception 0 es 39 kozott
public abstract class Element {
	//Az adott bemenetekre kötött huzalok referenciáját tartalmazza.
	protected Wire[] inputWires;
	//A kimenetre kötött tetszőleges számú huzal referenciáját tartalmazza.
	protected Wire[][] outputWires;
	/*
	 * A shouldUpdate() függvénnyel állítható true értékre. 
	 * Az isUpdateSucces() csak akkor végez érdemi műveleteket, 
	 * ha a shouldUpdate true értéket vesz fel.
	 */
	protected boolean shouldUpdate;
	protected String buffer; 
	/*
	 * Az elem belső állapotának változását végzi a bemenetek értékének függvényében. 
	 * Ha az adott elem változott, akkor azt jelzi a visszatérési értéken.
	 */
	abstract public boolean isUpdateSuccess() throws Exception;
	//Az elem belső állapotának értékét adja vissza.
	abstract public int getState(int nbOfOutput) throws Exception;
	//A shouldUpdate attribútumot állítja true értékre.
	public void shouldUpdate(){
		shouldUpdate = true;
	}
	public void allOutputWiresShouldUpdate(){
		if(outputWires != null)
			for(int actOutput=0; actOutput<outputWires.length; actOutput++)
				for(int act=0; act<outputWires[actOutput].length; act++)
					outputWires[actOutput][act].shouldUpdate();
	}
	//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*
	//InputWires
	/*
	 * Az adott hálózati elemhez tartozó bemenetek számát állítja be.
	 */
	public void setInputWireNumbers(int nbOfInputWires) throws Exception{
		if( 0<nbOfInputWires )
			inputWires = new Wire[ nbOfInputWires ];
		else
			throw new Exception("0");
	}
	//A paraméterként kapott huzal referenciáját beállítja a paraméterként azonosított sorszámú bemenetre.
	public void setActualInputWire(int nbOfWire,Wire act) throws Exception{
		if( inputWires != null ){
			if( ( -1<nbOfWire ) && ( nbOfWire<inputWires.length ) )
				inputWires[ nbOfWire ] = act;
			else
				throw new Exception("2");
		}
		else
			throw new Exception("1");
	}
	//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*
	//OutputWires
	public void setOutputNumbers(int nbOfOutput) throws Exception{
		if(nbOfOutput < 1)
			throw new Exception("9");
		outputWires = new Wire[nbOfOutput][];
	}
	
	public int getOutputNumbers(){
		if( outputWires != null)
			return outputWires.length;
		return 0;
	}
	//Az adott hálózati elemhez tartozó egyetlen kimenetre kötött huzalok számát állítja be.
	public void setOutputWireNumbers(int actOutput, int nbOfOutputWires) throws Exception{
		if( 0<nbOfOutputWires ){
			if( (actOutput < 0) && (outputWires.length<=actOutput) )
				throw new Exception("10");
			outputWires[actOutput] = new Wire[ nbOfOutputWires ];
		}
		else
			throw new Exception("3");
	}
	//A paraméterként kapott huzal refernciáját állítja be az elem egyetlen kimenetére.	
	public void setActualOutputWire(int actOutput, int nbOfWire, Wire act) throws Exception{
		if( (actOutput < 0) && (outputWires.length<=actOutput) )
			throw new Exception("10");
		if( outputWires != null ){
			if( ( nbOfWire < 0 ) || ( outputWires[actOutput].length <= nbOfWire ) )
				throw new Exception("6");
			outputWires[actOutput][ nbOfWire ] = act;
		}
		else
			throw new Exception("5");
	}
	//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*
	//Check
	//Azit vizsgálja,hogy az adott elem ki és bemeneteire csatlakoznak-e
	//huzalok,ha nem akkor hibát dob
	public void check() throws Exception{
		if(inputWires != null)
			for(int act=0; act<inputWires.length; act++)
				if(inputWires[act] == null)
					throw new Exception("11 Missing inputWire Number:"+act);
		
		if(outputWires != null)
			for(int act=0; act<outputWires.length; act++){
				if(outputWires[act] == null)
					throw new Exception("12 Missing outputWire Number:"+act);
				for(int actOutput=0; actOutput<outputWires[act].length; actOutput++)
					if( outputWires[act][actOutput] == null)
						throw new Exception("13 Kimenet szama:"+act+" Huzal sorszama:"+actOutput);
			}
	}
	//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*//*
	//
	/**
	 * @return the buffer
	 */
	public String getBuffer() {
		return buffer;
	}
	/**
	 * @param buffer the buffer to set
	 */
	public void setBuffer(String buffer) {
		this.buffer = buffer;
	}
	
}
